package clasificacion;

import static org.junit.Assert.*;

import org.junit.Test;

public class TestClasificacion {
/***
 * Metodos de Testeo de Seleccion Directa
 */
	@Test
	public void TestSeleccionDirectaGenericos() {
		GeneradorDatosGenericos gdg = new GeneradorDatosGenericos();
		int[] arrayTest =  gdg.generarDatosAleatorios();
		TClasificacion clasif = new TClasificacion();
		clasif.clasificar(arrayTest, 1);
		assertTrue(CheckearOrdenados(arrayTest));		
	}
	@Test
	public void TestSeleccionDirectaRepetidos(){
		int[] arrayTestRepetidos = {7,1,6,4,0,5,7,4,3,9};
		TClasificacion clasif = new TClasificacion();
		clasif.clasificar(arrayTestRepetidos, 1);
		assertTrue(CheckearOrdenados(arrayTestRepetidos));
	}
	@Test
	public void TestSeleccionDirectaNull(){
		TClasificacion clasif = new TClasificacion();
		int[] arrayTestNull = null;
		clasif.clasificar(arrayTestNull, 1);
		assertNull(arrayTestNull);
	}
	@Test
	public void TestSeleccionDirectaSingle(){
		TClasificacion clasif = new TClasificacion();
		int[] arraySingle = {1};		
		clasif.clasificar(arraySingle, 1);
		assertTrue(CheckearOrdenados(arraySingle));
	}
	@Test
	public void TestSeleccionDirectaNegativos(){
		TClasificacion clasif = new TClasificacion();
		int[] arrayNegativos = {5,1,-3,-6,4,2};
		clasif.clasificar(arrayNegativos, 1);
		assertTrue(CheckearOrdenados(arrayNegativos));
	}
	@Test
	public void TestSeleccionDirectaVacio(){
		TClasificacion clasif = new TClasificacion();
		int[] arrayTestVacio = {};
		clasif.clasificar(arrayTestVacio, 1);
		assertTrue(CheckearOrdenados(arrayTestVacio));
	}
	
	/***
	 * Metodos de Testeo de Heapsort
	 */
	@Test
	public void TestHeapsortGenericos(){
		GeneradorDatosGenericos gdg = new GeneradorDatosGenericos();
		int[] arrayTest =  gdg.generarDatosAleatorios();
		TClasificacion clasif = new TClasificacion();
		clasif.clasificar(arrayTest, 2);
		assertTrue(CheckearOrdenados(arrayTest));	
	}
	@Test
	public void TestHeapsortRepetidos(){
		int[] arrayTestRepetidos = {7,1,6,4,0,5,7,4,3,9};
		TClasificacion clasif = new TClasificacion();
		clasif.clasificar(arrayTestRepetidos, 2);
		assertTrue(CheckearOrdenados(arrayTestRepetidos));
	}
@Test	
	public void TestHeapsortNull(){
	TClasificacion clasif = new TClasificacion();
	int[] arrayTestNull = null;
	clasif.clasificar(arrayTestNull, 2);
	assertNull(arrayTestNull);
}
	@Test
	public void TestHeapsortSingle(){
		TClasificacion clasif = new TClasificacion();
		int[] arraySingle = {1};		
		clasif.clasificar(arraySingle, 2);
		assertTrue(CheckearOrdenados(arraySingle));
	}
	@Test
	public void TestHeapsortNegativos(){
		TClasificacion clasif = new TClasificacion();
		int[] arrayNegativos = {5,1,-3,-6,4,2};
		clasif.clasificar(arrayNegativos, 2);
		assertTrue(CheckearOrdenados(arrayNegativos));
	
	}
	@Test
	public void TestHeapsortVacio(){
		TClasificacion clasif = new TClasificacion();
		int[] arrayTestVacio = {};
		clasif.clasificar(arrayTestVacio, 2);
		assertTrue(CheckearOrdenados(arrayTestVacio));
	}
	
	/**
	 * Metodo Auxiliar que Chequea que el array este ordenado
	 * @return true si esta ordenado, false si no lo esta
	 */
	public boolean CheckearOrdenados(int [] arrayClasif){
		
		if(arrayClasif.length<=1){
			return true;
		}else{
		
		for(int i =0; i <arrayClasif.length-2;i++){
				if(arrayClasif[i]>arrayClasif[i+1]){
					return false;
				}
			}
		}
		return true;
	}
	
	

}
